package com.zipeng.gulimall.order.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * 容器中的 Binding，Queue，Exchange 都会自动创建（RabbitMQ没有的情况）
 * RabbitMQ 只要有。@Bean声明属性发生变化也不会覆盖
 */
@Configuration
public class MyMQConfig {
    /**
     * 订单延时队列
     * @return
     */
    @Bean
    public Queue orderDelayQueue() {
        Map<String,Object> arguments = new HashMap<>();
        // 死信路由
        arguments.put("x-dead-letter-exchange","order-event-exchange");
        // 路由键
        arguments.put("x-dead-letter-routing-key","order.release.order");
        // 生存时间：1分钟
        arguments.put("x-message-ttl",60000);
        /**
         * 参数：队列名，持久化，排他，自动删除，自定义属性
         */
        Queue queue = new Queue("order.delay.queue", true, false, false,arguments);
        return queue;
    }

    /**
     * 订单释放队列
     * @return
     */
    @Bean
    public Queue orderReleaseOrderQueue() {
        /**
         * 参数：队列名，持久化，排他，自动删除
         */
        Queue queue = new Queue("order.release.order.queue", true, false, false);
        return queue;
    }

    /**
     * 订单事件交换机
     * @return
     */
    @Bean
    public Exchange orderEventExchange() {
        /**
         * 参数：名称，持久化，自动删除
         */
        return new TopicExchange("order-event-exchange",true,false);
    }

    /**
     * 交换机 & 队列 绑定
     * @return
     */
    @Bean
    public Binding orderCreateOrderBingding() {
        /**
         * 参数：目的地，类型，交换机，路由键，自定义参数
         */
        return new Binding("order.delay.queue",
                Binding.DestinationType.QUEUE,
                "order-event-exchange",
                "order.create.order",
                null);

    }

    /**
     * 交换机 & 队列 绑定
     * @return
     */
    @Bean
    public Binding orderReleaseOrderBingding() {
        /**
         * 参数：目的地，类型，交换机，路由键，自定义参数
         */
        return new Binding("order.release.order.queue",
                Binding.DestinationType.QUEUE,
                "order-event-exchange",
                "order.release.order",
                null);
    }

//    /**
//     * 订单释放直接和库存释放进行绑定
//     * @return
//     */
//    @Bean
//    public Binding orderReleaseOtherBingding() {
//        return new Binding("stock.release.stock.queue",
//                Binding.DestinationType.QUEUE,
//                "order-event-exchange",
//                "order.release.other.#",
//                null);
//    }
//
//
//    @Bean
//    public Queue orderSeckillOrderQueue(){
//        //String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
//        return new Queue("order.seckill.order.queue",true,false,false);
//    }
//
//    @Bean
//    public Binding orderSeckillOrderQueueBinding(){
//        /**
//         * String destination, DestinationType destinationType, String exchange, String routingKey,
//         * 			Map<String, Object> arguments
//         */
//        return new Binding("order.seckill.order.queue",
//                Binding.DestinationType.QUEUE,
//                "order-event-exchange",
//                "order.seckill.order",
//                null);
//    }

}
